/**
    算法思路：所有num任意组合得到的总和，将大家都有的最大的那个总和进行输出即可。
    核心问题：如何得到所有num任意组合得到的总和？
    解决所需数据结构+算法：标记总和是否存在的一维bool数组、遍历物品方式维护该数组。
**/

#include<iostream>
#include<cstring>
using namespace std;

// a数组存放第几个数列的所有数字，len数组存放所有数列的长度
int n, a[110] = {0}, total[11000] = {0};

int main() {
    cin >> n;
    for (int i=0; i<n; i++) {
        int num, sum = 0, len = 0;
        bool f[11000] = {true, false};

        while(cin >> num) {
            // 输入数据
            if(num == -1)
                break;
            a[len++] = num;
        }

        for(int j=0; j<len; j++) {
            // 遍历len个物品
            for(int k=sum; k>=0; k--) {
                // 从后往前维护 f 数组
                // 为什么不从前往后维护？
                if(f[k]) {
                    // f[k] 为true代表的意思是？
                    f[k + a[j]] = true;
                    sum = max(sum, k + a[j]);
                }
            }
        }

        for(int i=0; i<=sum; i++)
            if(f[i])
                total[i]++;
    }

    for(int i=11000; i>=0; i--) {
        if(total[i] == n) {
            cout << i << endl;
            break;
        }
    }

    return 0;
}